package com.yehebl.orm.data.common.dao;

import java.util.List;
import java.util.Map;

import com.yehebl.orm.data.common.xml.AQueryXmlSql;

/**
 * 查询list 的接口
 */
public interface IListDao {

    /**
     * @param sqlName     xml中的name
     * @param clazz       返回的类类型
     * @param queryXmlSql 查询条件
     * @return 返回 list
     */
    <T> List<T> findBySqlName(String sqlName, AQueryXmlSql queryXmlSql, Class<T> clazz);

    /**
     * @param sqlName xml中的name
     * @param clazz   返回的类类型
     * @return 返回 list
     */
    <T> List<T> findBySqlName(String sqlName, Class<T> clazz);

    /**
     * @param sqlName     xmlSqlName
     * @param queryXmlSql 查询条件生成sql
     * @param size        查询条数
     * @param clazz       返回类型
     */
    <T> List<T> findBySqlName(String sqlName, AQueryXmlSql queryXmlSql, int size, Class<T> clazz);

    /**
     * @param sqlName xmlSqlName
     * @param size    查询条数
     * @param clazz   返回类型
     */
    <T> List<T> findBySqlName(String sqlName, int size, Class<T> clazz);

    /**
     * 查询所有数据
     *
     */
    <T> List<T> findAll(Class<T> clazz);

    /**
     * 单个表达式查询
     *
     */
    <T> List<T> findByExpression(String expression, Object value, Class<T> clazz);

    /**
     * key 为表达式，EQ_字段名 value 位置
     *
     * @param params 参数
     */
    <T> List<T> findByMap(Map<String, Object> params, Class<T> clazz);

    /**
     * key 为表达式，EQ_字段名 value 位置
     *
     * @param params 参数
     * @param page 页码 1开始
     * @param size 条数
     */
    <T> List<T> findByMap(Map<String, Object> params, Integer page, Integer size, Class<T> clazz);

    /**
     * key 为表达式，EQ_字段名 value 位置
     *
     * @param params 参数
     * @param size 条数
     */
    <T> List<T> findByMap(Map<String, Object> params, Integer size, Class<T> clazz);

    /**
     * 分页查询list,不查询总条数
     *
     * @param sqlName xml中sql name
     * @param page    页码 从1开始
     * @param size    条数
     * @param clazz   返回的类
     */
    <T> List<T> findBySqlName(String sqlName, AQueryXmlSql queryXmlSql, Integer page, Integer size,
                              Class<T> clazz);

    /**
     * @param sqlName     xml中的name
     * @param queryXmlSql 查询条件
     * @return 返回 list
     */
    List<Map<String, Object>> findMapBySqlName(String sqlName, AQueryXmlSql queryXmlSql);

    /**
     * @param sqlName xml中的name
     * @return 返回 list
     */
    List<Map<String, Object>> findMapBySqlName(String sqlName);

    /**
     * sql查询
     *
     * @param sql sql语句 ?参数
     * @param objs 参数
     */
    <T> List<T> findBySql(String sql, Class<T> clazz, Object... objs);

    /**
     * 分页查询list<Map>,不查询总条数
     *
     * @param sqlName  sqlName
     * @param queryXmlSql 处理sql类
     * @param size 条数
     */
    List<Map<String, Object>> findMapBySqlName(String sqlName, AQueryXmlSql queryXmlSql, Integer size);

    /**
     * 分页查询list<Map>,不查询总条数
     *
     * @param sqlName sqlName
     * @param queryXmlSql 处理sql类
     * @param size 条数
     */
    List<Map<String, Object>> findMapBySqlName(String sqlName, AQueryXmlSql queryXmlSql, Integer page, Integer size);

}
